#include<iostream>


using namespace std;
const int N=1e5+10;
int a[N];
int n;
void down(int parent,int len)
{
	int child=parent*2;
	while(child<=len)
	{
		if(child+1<=len&&a[child+1]>a[child]) child++;
		if(a[parent]>a[child]) return;
		swap(a[parent],a[child]);
		parent=child;
		child=parent*2;
	}
}
void Sort()
{
	//1建对,O(N)
	for(int i=n/2;i>=1;i--)//遍历到所有需要调整的父节点,从最后的非叶子节点开始
	{
		down(i,n);
	}
	//2,排序，删除堆顶元素(交换），向下调整直到堆中只剩下一个
	for(int i=n;i>1;i--)
	{
		swap(a[i],a[1]);
		down(1,i-1);
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	Sort();
	for(int i=1;i<=n;i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
}